#include "stdio.h"
#include "stdint.h"
#include "string.h"
#include "LsdMem.h"

//#define MEM_FLAG_CNT (MEM_MAX_SIZE / MEM_LIMIT_CNT)
//#define MEM_MAX_BITS 32

//#if (MEM_FLAG_CNT % MEM_MAX_BITS)
//#define MEM_UINT32_CNT ((MEM_FLAG_CNT / MEM_MAX_BITS) + 1)
//#else
//#define MEM_UINT32_CNT (MEM_FLAG_CNT / MEM_MAX_BITS)
//#endif

//typedef struct
//{
//	uint8_t flag1;
//	uint8_t flag2;
//	uint8_t cnt1;
//	uint8_t cnt2;
//}TypeMemHeadInfo;

//static uint32_t MemFlag[MEM_UINT32_CNT];//32 * 4 = 128
//static uint8_t MemBuff[MEM_MAX_SIZE];//最大的内存空间
//static uint8_t MemInitFlag = 1;
//static uint32_t ErrorCnt = 0;
uint32_t MemAllocCnt = 0;
uint32_t MemUseCnt = 0;

//static const uint8_t bits_in_char[256] = {             
//	  0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2,
//    3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3,
//    3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3,
//    4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,
//    3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5,
//    6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4,
//    4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5,
//    6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
//    3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3,
//    4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6,
//    6, 7, 6, 7, 7, 8};

//static const uint32_t MemFlagTab[MEM_MAX_BITS + 1]={0,
//    0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
//    0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
//    0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
//    0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF};
//	
//__weak void OnMallocErrorCB(uint8_t type){}

//void *pvPortMalloc(uint32_t tlen)   //@7 内存分配不能大于1024-32
//{
//    //这里要关闭所有中断
//    if(MemInitFlag)//初始化
//    {
//        MemInitFlag = 0;
//        //初始化标志
//        memset(MemFlag, 0xFF, MEM_UINT32_CNT * sizeof(uint32_t));
//#if (MEM_FLAG_CNT % MEM_MAX_BITS)
//			  MemFlag[MEM_UINT32_CNT - 1] = MemFlagTab[MEM_MAX_BITS - MEM_FLAG_CNT % MEM_MAX_BITS];
//#endif
//        //初始化内存空间
//        memset(MemBuff, 0, MEM_MAX_SIZE);
//    }
//    void *out = NULL;
//    uint8_t cnt = (uint8_t)((tlen + 4) / MEM_LIMIT_CNT);
//    if((tlen + 4) % MEM_LIMIT_CNT) cnt++;
//		if(cnt > MEM_MAX_BITS){cnt = MEM_MAX_BITS; ErrorCnt++; /*printf("alloc count is too large!\n");*/} 
//    if(cnt <= MEM_MAX_BITS)//无法分配大于32的内存空间
//    {
//        //从内存中查找相应的地方
//        uint8_t offset = MEM_MAX_BITS + 1 - cnt;
//			  uint32_t tempData = 0;
//				uint8_t bitCnt = 0;
//			  uint8_t *pBuff = NULL;
//        for(uint8_t i = 0; i < MEM_UINT32_CNT; i++)   //@7 轮询MemFlag[]的一维数组
//        {
//            if(MemFlag[i])//有可用空间
//            {
//								pBuff = (uint8_t *)&MemFlag[i];
//								bitCnt = bits_in_char[pBuff[0]] + bits_in_char[pBuff[1]] + bits_in_char[pBuff[2]] + bits_in_char[pBuff[3]]; //@7  一维数组中MemFlag[] 未使用的内存
//							  if(bitCnt >= cnt)
//								{
//									for(uint8_t j = 0; j < offset; j++)
//									{
//											tempData = MemFlagTab[cnt] << j;   //@7 比对是否有连续的内存
//											if((MemFlag[i] & tempData) == tempData)
//											{
//													MemFlag[i] ^= tempData;
//												  tempData = (i * MEM_MAX_BITS + j) * MEM_LIMIT_CNT;  //@7 获取当前的地址
//													//添加内存分配信息到内存末尾更安全
//													MemBuff[tempData++] = 0xaa;
//													MemBuff[tempData++] = 0x55;
//													MemBuff[tempData++] = ~cnt;
//													MemBuff[tempData++] = cnt;
//													out = (void *)&MemBuff[tempData];
//													MemAllocCnt++;
//													MemUseCnt += cnt * MEM_LIMIT_CNT;
//#if (MEM_INIT_ZERO == 1)
//													memset(&MemBuff[tempData], 0, cnt * MEM_LIMIT_CNT - 4);  //@7  自动赋0
//#endif
//													break;
//											}
//									}
//								}
//            }
//            if(out) break;
//        }
//    }
//		if(out == NULL) {ErrorCnt++; OnMallocErrorCB(0);}//如果内存分配失败,交给应用层去处理
//    //这里打开所有中断
//    return out;
//}

//void vPortFree(void *obj)
//{
//	size_t objAddr = (size_t)obj;
//	size_t memAddr = (size_t)MemBuff;
//	if(obj)
//	{
//		if(((objAddr % MEM_HEAD_SIZE) == 0) && (objAddr >= memAddr) && (objAddr < (memAddr + MEM_MAX_SIZE)))
//		{
//				 //计算得到当前位置
//				uint8_t i = (uint8_t)((objAddr - memAddr) / (MEM_LIMIT_CNT * MEM_MAX_BITS));
//				uint8_t j = (uint8_t)(((objAddr - memAddr) / MEM_LIMIT_CNT) % MEM_MAX_BITS);
//				uint8_t cnt = (uint8_t)(*((uint8_t *)obj - 1));
//				//合法性检查
//				if(((cnt + *((uint8_t *)obj - 2)) == 0xFF) && ((*((uint8_t *)obj - 3) + *((uint8_t *)obj - 4)) == 0xFF))
//				{
//						if(MemAllocCnt > 0) MemAllocCnt--;
//					  if(MemUseCnt >= (cnt * MEM_LIMIT_CNT)) MemUseCnt -= cnt * MEM_LIMIT_CNT;
//						MemFlag[i] |= MemFlagTab[cnt] << j;//全部恢复成1
//				}
//				else
//				{
//						//内存分配有越界 使用其它方法检查内存的释放
//						//printf("mem free Error! wrong obj info!\n");
//						ErrorCnt++;
//				}
//		}
//		else
//		{
//				//printf("mem free Error! unkown obj addr!\n");
//				ErrorCnt++;
//		}
//	}
//}

